<?php


// 观察者模式需要两个类
// 男人类  	女朋友类
// 男人类小明有两个女盆友		小花 小丽
// 当小明花钱时，通知小花和小丽
class Man
{
	// 观察者数组,用来存放观察者
	protected $watchs = [];

	// 添加观察者方法
	function addOb($observe)
	{
		$this->watchs[] = $observe;
	}

	// 删除观察者方法
	function delOb($observe)
	{
		// 查找对应值在数组中的键
		$key = array_search($observe, $this->watchs);
		// 按照键删除值，并且数组重新索引
		array_splice($this->watchs, $key, 1);
	}

	// 花钱的方法
	function buy()
	{
		// 当被观察者做出这个行为时，让观察者得到通知，并做出一定的反应
		foreach ($this->watchs as $observe) {
			$observe->watch();
		}
	}
}

class Xiaohua
{
	function watch()
	{
		echo '你男朋友在花钱<br />';
	}
}

// 实例化对象
$man = new Man();
$Xiaoli = new Xiaohua();
$Xiaohua = new Xiaohua();

// 添加观察者
$man->addOb($Xiaohua);
$man->addOb($Xiaoli);

$man->delOb($Xiaoli);
$man->buy();